package com.tdam2011.grupo04.SMSWeb;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.tdam2011.grupo04.R;
import com.tdam2011.grupo04.Sql;
import com.tdam2011.grupo04.entidades.Contacto;
import com.tdam2011.grupo04.entidades.ListaContactos;
import com.tdam2011.grupo04.entidades.Mensaje;

public class MensajeWeb extends ListActivity implements OnItemLongClickListener{
	
	private final int DIALOG_ENVIO_INCORRECTO= 0;
    private final int DIALOG_NO_CONECTADO= 1;
    private final int DIALOG_DATOS_IMCOMPLETOS= 2;
    private final int DIALOG_ELIMINAR_MENSAJE= 3;
		
	static final int MENSAJE_RECIBIDO= 0;
	static final int MENSAJE_ENVIADO= 1;
	
	private TextView txtDestino;
	private TextView txtMensaje;
	private Button btnEnviar;
	
	private String usuarioDestino= null;
	private String nombreUsuarioDestino= null;
	private String idContacto= null;
	
	private MensajeAdapter adapter;
	private com.tdam2011.grupo04.entidades.Mensaje mensajeSeleccionado;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	    setContentView(R.layout.mensaje);
		
	    adapter= new MensajeAdapter();
	    getListView().setAdapter(adapter);
	    
	    this.getListView().setOnItemLongClickListener(this);
	    
	    txtDestino= (TextView) findViewById(R.id.txt_mensaje_destino);
	    txtMensaje= (TextView) findViewById(R.id.txt_mensaje_contenido);
	    btnEnviar= (Button) findViewById(R.id.btn_enviarMensaje);

	    Bundle extras = getIntent().getExtras();
	    
        if(extras != null){
        	nombreUsuarioDestino= extras.getString("labelUsuario");
        	usuarioDestino= extras.getString("usuario");
        	idContacto= extras.getString("idcontacto");
        	
        	if(extras.getBoolean("esNotification", false)) ConsultaMensajeService.mNotificationManager.cancel(extras.getInt("nroMensaje"));
	    	
        	String labelMensaje= (nombreUsuarioDestino == null || nombreUsuarioDestino.equals(usuarioDestino))? usuarioDestino : nombreUsuarioDestino + " <\"" + usuarioDestino + "\">";
        	txtDestino.setEnabled(false);
        	txtDestino.setTextColor(Color.WHITE);
        	txtDestino.setText(labelMensaje);
        	txtDestino.setBackgroundColor(Color.DKGRAY);
        	cargarConversacion();
        }
		        
	    btnEnviar.setOnClickListener(new Button.OnClickListener() {
					
		    @Override
		    public void onClick(View arg0) {
		    	if(!ComunicacionServer.isOnline){
		    		showDialog(DIALOG_NO_CONECTADO);
					return;
		    	}
		    	
		    	SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE); 
		    	String usuario= app_preferences.getString("usuario", "user");
		    	String contrasenia= app_preferences.getString("contrasenia", "pass");
						
		    	try{
		    		if(usuarioDestino == null){
		    			usuarioDestino= txtDestino.getText().toString();
		    			nombreUsuarioDestino= usuarioDestino;
		    		}
		    		
		    		ComunicacionServer cs= new ComunicacionServer(usuario, contrasenia);
		    		String xml = cs.getXML(ComunicacionServer.COM_ENVIAR, 
		    			usuarioDestino, 
		    			txtMensaje.getText().toString(), 
		    			null
		    		);
				    if(cs.parsear(xml, ComunicacionServer.COM_ENVIAR)){
				    	com.tdam2011.grupo04.entidades.Mensaje mensaje= new Mensaje();
				    	mensaje.setLabelContacto(nombreUsuarioDestino);
			        	mensaje.setNombreContacto(usuarioDestino);
			        	mensaje.setIdContacto((idContacto == null)? 0 : Long.valueOf(idContacto));
			        	mensaje.setCuerpoMensaje(txtMensaje.getText().toString());
			        	agregarMensaje(usuario, mensaje, MENSAJE_ENVIADO);
			        	
			        	setResult(MensajeWeb.RESULT_OK);
			        	finish();
				    }
				    else
				    	showDialog(DIALOG_ENVIO_INCORRECTO);
		    	}catch(Exception e){ e.printStackTrace(); }
		    }
	    });
	}
	
	private void cargarConversacion(){
		SharedPreferences app_preferences = getSharedPreferences("usuarioRegistrado", MODE_PRIVATE); 
    	String user= app_preferences.getString("usuario", "user");
		
		Sql sql = new Sql(this);		
		Cursor cur = sql.getAllMensajesWeb("*", "usuario = '" + user + "' and usuarioDestino='" + usuarioDestino +"'");
		
		adapter.clearList();
		
		if(cur.getCount() > 0) {
			while (cur.moveToNext()){
				int idMensaje= cur.getInt(cur.getColumnIndex("mensajeWebID"));
				String usuario = cur.getString(cur.getColumnIndex("usuarioDestino"));
				String cuerpoMensaje = cur.getString(cur.getColumnIndex("mensaje"));
				long fecha= cur.getLong(cur.getColumnIndex("fecha"));
				
				com.tdam2011.grupo04.entidades.Mensaje mensajeWeb = new com.tdam2011.grupo04.entidades.Mensaje();
				mensajeWeb.setId(idMensaje);
				mensajeWeb.setNombreContacto(usuario);
				if(cur.getInt(cur.getColumnIndex("tipo")) == MENSAJE_RECIBIDO){
					if(nombreUsuarioDestino == null){
						nombreUsuarioDestino= usuario;
						int idContact= cur.getInt(cur.getColumnIndex("contactoID"));
						if(idContact > 0){
							List<Contacto> contactos= new ListaContactos().getContactos("DISPLAY_NAME ASC", this);
							for(Contacto contacto : contactos)
								if(contacto.getId().equals(String.valueOf(idContact))){
									nombreUsuarioDestino= contacto.getNombre();
									break;
								}
						}
						
					}
					mensajeWeb.setLabelContacto(nombreUsuarioDestino);
				}else
					mensajeWeb.setLabelContacto("Yo");
				mensajeWeb.setCuerpoMensaje(cuerpoMensaje);
				mensajeWeb.setFechaEnvio(fecha);
					
				adapter.addMensaje(mensajeWeb);
			}			
		}
		cur.close();
		sql.close();
		adapter.notifyDataSetChanged();
	}
	
	class MensajeAdapter extends BaseAdapter{
		private ArrayList<com.tdam2011.grupo04.entidades.Mensaje> mensajes;
		private LayoutInflater inflater;
		
		
		public MensajeAdapter() {
			mensajes = new ArrayList<com.tdam2011.grupo04.entidades.Mensaje>();
			inflater = LayoutInflater.from(MensajeWeb.this);
		}

		public void addMensaje(com.tdam2011.grupo04.entidades.Mensaje mensaje) {
			if (mensaje != null) {
				this.mensajes.add(mensaje);
			}
		}
		
		public int getCount() {
			return mensajes.size();
		}
		
		public Object getItem(int position) {
			return mensajes.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public void clearList(){
			mensajes.clear();
		}
		
		public void deleteItem(com.tdam2011.grupo04.entidades.Mensaje mensaje){
			mensajes.remove(mensaje);
		}

		class Holder {
			private ImageView img_contacto;
			private TextView txt_nombreContacto;
			private TextView txt_fechaEnvio;
			private TextView txt_cuerpoMensaje;
		}

		public View getView(int position, View convertView, ViewGroup arg2){
			Holder holder;
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.historiales_fila , null);
				holder = new Holder();
				holder.txt_nombreContacto = (TextView) convertView
						.findViewById(R.id.txt_nombreContacto);
				holder.txt_fechaEnvio = (TextView) convertView
						.findViewById(R.id.txt_fechaMensaje);
				holder.img_contacto = (ImageView) convertView
						.findViewById(R.id.img_contacto);
				holder.txt_cuerpoMensaje = (TextView) convertView
						.findViewById(R.id.txt_cuerpoMensaje);
				convertView.setTag(holder);
			} else
				holder = (Holder) convertView.getTag();

			com.tdam2011.grupo04.entidades.Mensaje mensaje = (com.tdam2011.grupo04.entidades.Mensaje) getItem(position);
			
			if(mensaje.getTieneFoto())
				holder.img_contacto.setImageURI(mensaje.getFoto());
			
			holder.txt_nombreContacto.setText(String.valueOf(mensaje.getLabelContacto()));
			holder.txt_cuerpoMensaje.setText(mensaje.getCuerpoMensaje());
			
			String fecha = millisToDate(mensaje.getFechaEnvio());
			holder.txt_fechaEnvio.setText(fecha);
			
			return convertView;
		}
	}
	
	@Override
	public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		mensajeSeleccionado= (com.tdam2011.grupo04.entidades.Mensaje)adapter.getItem(position);
        showDialog(DIALOG_ELIMINAR_MENSAJE);
                       
        return false;
	}
	
	@Override
	protected Dialog onCreateDialog(int id) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Error en el envío del Mensaje");
        builder.setIcon(R.drawable.nuevo_mensajeweb);
        switch(id){
        case DIALOG_ENVIO_INCORRECTO:
                builder.setMessage("No se pudo enviar el mensaje");
                break;
        case DIALOG_NO_CONECTADO:
                builder.setMessage("Se necesita de una conexión de datos para poder usar el servicio");
                break;
        case DIALOG_DATOS_IMCOMPLETOS:
                builder.setMessage("Es necesario que se completen todos los campos");
                break;
        case DIALOG_ELIMINAR_MENSAJE:
        		builder.setTitle("Eliminar Mensaje");
                builder.setMessage("¿Desea eliminar el Mensaje?");
               
                builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {            
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                                eliminarMensaje(mensajeSeleccionado);
                        dialog.cancel();
                        }
                });
               
                builder.setNegativeButton("Cancelar", new OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
            });
                break;
        }
       
        if(id != DIALOG_ELIMINAR_MENSAJE){
                builder.setPositiveButton("Aceptar", new DialogInterface.OnClickListener() {            
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                        }
                });
        }
       
        AlertDialog alert = builder.create();
        return alert;

	}

	private void agregarMensaje(String usuario, com.tdam2011.grupo04.entidades.Mensaje mensaje, int tipoMensaje){
		Sql sql= new Sql(this);
    	sql.addMensajeWeb(usuario, mensaje, tipoMensaje);
	}
	
	private void eliminarMensaje(com.tdam2011.grupo04.entidades.Mensaje mensaje){
		Sql sql = new Sql(this);
		sql.eliminarMensajeWeb(mensaje.getId());
		sql.close();
		
		adapter.deleteItem(mensaje);
		adapter.notifyDataSetChanged();
	}
	
	public static String millisToDate(long currentTime) {
	    String finalDate;
	    Calendar calendar = Calendar.getInstance();
	    calendar.setTimeInMillis(currentTime);
	    Date date = calendar.getTime();
	    finalDate = date.toString();
	    return finalDate;
	}
}
	
